package com.example.a05;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

import java.lang.ref.WeakReference;
import java.util.Timer;
import java.util.TimerTask;

public class FrameLayout extends AppCompatActivity {
    Button btnReturn;

    // 定义一个颜色数组
    int[] colors = {
            R.color.color1, R.color.color2, R.color.color3,
            R.color.color4, R.color.color5, R.color.color6,
            R.color.color7
    };

    // 定义一个TextView的id数组，用于关联TextView组件
    int[] names = {
            R.id.textView1, R.id.textView2, R.id.textView3,
            R.id.textView4, R.id.textView5, R.id.textView6,
            R.id.textView7
    };

    // 创建一个TextView数组，用于关联TextView组件
    TextView[] views = new TextView[names.length];

/*  为何不在子线程（如TimerTask的run方法）直接更新TextView背景？
    因为Android的View和UI组件不具备线程安全特性，禁止在非主线程直接操作UI。
    因此通过Handler实现主线程UI更新。同时，为避免内存泄漏（如Activity销毁后Handler仍持有强引用），
    自定义MyHandler使用弱引用（WeakReference）关联Activity，降低内存泄漏风险。
    */
    class MyHandler extends Handler {
        private final WeakReference<FrameLayout> activity; // 弱引用持有FrameLayout实例
        // 构造方法，传入当前FrameLayout的弱引用
        public MyHandler(WeakReference<FrameLayout> activity) {
            this.activity = activity;
        }
        // 当前颜色索引
        private int currentColor = 0;
        // 重写handleMessage方法，处理自定义消息
        @Override
        public void handleMessage(Message msg) {
            // 处理自定义消息（0x123为消息标识）
            // 表明当前消息为自定义消息
            if (msg.what == 0x123) {
                FrameLayout targetActivity = activity.get(); // 从弱引用获取FrameLayout实例
                if (targetActivity != null) { // 检查Activity是否已被回收
                    int len = targetActivity.names.length;
                    for (int i = 0; i < len; i++) {
                        // 根据颜色数组和当前颜色索引，更新TextView背景
                        targetActivity.views[i].setBackgroundResource(
                                targetActivity.colors[(i + currentColor) % targetActivity.colors.length]);
                    }
                    currentColor++; // 颜色索引递增
                }
            }
            super.handleMessage(msg);
        }
    }

    // 初始化Handler，传入当前FrameLayout的弱引用
    private final Handler handler = new MyHandler(new WeakReference<>(this));

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_frame_layout);
        setTitle("布局管理-帧布局");

        btnReturn = findViewById(R.id.btnReturnHome);
        btnReturn.setOnClickListener(new mClick());

        for (int i = 0; i < 7; i++) {
            views[i] = findViewById(names[i]);
        }

        // 定时更新颜色
        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                handler.sendEmptyMessage(0x123);
            }
        }, 0, 200);
    }

    // 返回主菜单事件
    private class mClick implements View.OnClickListener {
        @Override
        public void onClick(View view) {
            if (view == btnReturn)
                // 返回主菜单
                startActivity(new Intent(FrameLayout.this, MainActivity.class));
        }
    }
}